package cn.com.huzo.repository.master;

import cn.com.huzo.model.entities.master.MaterialEntity;
import huzofw.repository.GenericRepository;
import java.util.List;
import java.util.Map;

/**
 * 材料数据访问对象接口。
 *
 * @author 吴旭
 */
public interface MaterialRepository extends GenericRepository<MaterialEntity, Long> {

    /**
     * 根据给定ID取得材料信息对象。
     *
     * @param rootNodeName 部门根节点名称
     * @param materialId 材料标识
     * @param currentUserId 当前用户
     * @param workFlowId 审核流程标识
     * @return 材料信息对象
     */
    MaterialEntity fetchByKey(String rootNodeName, Long materialId, Long currentUserId, Long workFlowId);

    /**
     * 根据料号取得材料信息对象。
     *
     * @param materialId 料ID
     * @return 材料信息对象
     */
    MaterialEntity fetchByMaterialId(Long materialId);

    /**
     * 批量更新材料所属目录。
     *
     * @param itemList 要更新的材料数据列表
     * @return 影响的行数
     */
    Integer batchChangeCatalogue(List<MaterialEntity> itemList);

    /**
     * 导入csv数据。
     *
     * @param instance 要导入的材料数据
     * @return 影响的行数
     */
    Integer importDataFromCsv(MaterialEntity instance);

    /**
     * 取得材料表的字段名称列表。
     *
     * @return 字段名称和汉字描述列表
     */
    List<MaterialEntity> fetchAllFields();

    /**
     * 根据给定导出条件取得材料信息对象。
     *
     * <p>
     * @param criterion 导出过滤条件
     * @return 材料信息对象
     */
    List<String> fetchExportData(Map<String, Object> criterion);

    /**
     * 根据输入的料号从材料信息中自动补全剩余的料号
     *
     * @param keyWord 输入的料号(部分料号)
     * @return
     */
    List<String> fetchMaterialCodeForAutoComplate(String keyWord);

    /**
     * 审核材料
     *
     * @param materialId 材料标识
     * @param workFlowId 审核流程标识
     * @param nodeOrder 审核流程步骤
     * @param checkedBy 审核人
     * @param isCheckCurrentNode 是否针对当前流程做审核
     * @return
     */
    Integer doCheck(Long materialId, Long workFlowId, Short nodeOrder, Long checkedBy, Short isCheckCurrentNode);

    /**
     * 反审材料
     *
     * @param materialId 材料标识
     * @param nodeOrder 审核流程步骤
     * @param checkedBy 审核人
     * @return
     */
    Integer doUnCheck(Long materialId, Short nodeOrder, Long checkedBy);
}
